package com.qiujie.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

/**
 * 文件上传工具类
 */
@Component
public class FileUtil {

    @Value("${file-path}")
    private String uploadPath;
    
    /**
     * 上传文件
     * 
     * @param file 文件
     * @param type 文件类型（用于分目录）
     * @return 相对路径
     * @throws IOException IO异常
     */
    public String upload(MultipartFile file, String type) throws IOException {
        // 获取文件名
        String originalFilename = file.getOriginalFilename();
        // 获取文件后缀
        String suffix = "";
        if (originalFilename != null && originalFilename.contains(".")) {
            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        }
        
        // 根据日期创建目录
        String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        // 构建目录路径
        String dirPath = uploadPath + "/" + type + "/" + datePath;
        File dir = new File(dirPath);
        if (!dir.exists()) {
            if (!dir.mkdirs()) {
                throw new IOException("创建目录失败: " + dirPath);
            }
        }
        
        // 生成新的文件名
        String fileName = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
        // 目标文件
        Path targetPath = Paths.get(dirPath, fileName);
        
        // 保存文件
        Files.copy(file.getInputStream(), targetPath);
        
        // 返回相对路径
        return "/" + type + "/" + datePath + "/" + fileName;
    }
    
    /**
     * 删除文件
     * 
     * @param filePath 文件路径
     * @return 是否删除成功
     */
    public boolean delete(String filePath) {
        if (filePath == null || filePath.isEmpty()) {
            return false;
        }
        
        try {
            // 删除文件
            File file = new File(uploadPath + filePath);
            return file.delete();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}